/*
 * 文 件 名:  Dom4jReadExmple.java
 * 版    权:   深圳埃思欧纳信息咨询有限公司版权所有. YYYY-YYYY,  All rights reserved
 * 描    述:   <描述>
 * 修 改 人:  honny.huang
 * 修改时间: 2011-4-7
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.dom4j.parseTest;

/**
 * <一句话功能简述> <功能详细描述>
 *
 * @author honny.huang
 * @version [版本号, 2011-4-7]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 利用dom4j进行XML编程
 * 
 * @author honny.huang
 * @since 20011.4.7
 */
public class Dom4jReadExmple {
	/**
	 * 遍历整个XML文件，获取所有节点的值与其属性的值，并放入HashMap中
	 * 
	 * @param filename
	 *            String 待遍历的XML文件（相对路径或者绝对路径）
	 * @param hm
	 *            HashMap
	 *            存放遍历结果，格式：<nodename,nodevalue>或者<nodename+attrname,attrvalue>
	 */
	public void iterateWholeXML(String filename, HashMap<String, String> hm) 
	{
		SAXReader saxReader = new SAXReader();
		try {
				// 从文件读取XML，输入文件名，返回XML文档
			    // read方法是重载的，可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就代表了整个XML。 
				Document document = saxReader.read(new File(filename));
				// 读取后的第二步，就是得到Root节点。熟悉XML的人都知道，一切XML分析都是从Root元素开始的。 
				Element root = document.getRootElement();
				// 用于记录学生编号的变量
				int num = -1;
				// 遍历根结点（students）的所有孩子节点（肯定是student节点）
				// 枚举所有子节点 
				for (Iterator iter = root.elementIterator(); iter.hasNext();) 
				{
					Element element = (Element) iter.next();
					num++;
					// 获取student节点的age属性的值
					Attribute ageAttr = element.attribute("age");
					if (ageAttr != null) 
					{
						String age = ageAttr.getValue();
						if (age != null && !age.equals(""))
						{
							hm.put(element.getName() + "-" + ageAttr.getName()
									+ num, age);
						} else {
							hm.put(element.getName() + "-" + ageAttr.getName()
									+ num, "20");
						}
					} else {
						hm.put(element.getName() + "-age" + num, "20");
					}
					// 遍历student结点的所有孩子节点（即name，college，telphone，notes），并进行处理
					for (Iterator iterInner = element.elementIterator(); iterInner.hasNext();) 
					{
						Element elementInner = (Element) iterInner.next();
						if (elementInner.getName().equals("college"))
						{
							hm.put(elementInner.getName() + num, elementInner.getText());
							// 获取college节点的leader属性的值
							Attribute leaderAttr = elementInner.attribute("leader");
							if (leaderAttr != null) 
							{
								String leader = leaderAttr.getValue();
								if (leader != null && !leader.equals("")) 
								{
									hm.put(elementInner.getName() + "-"
											+ leaderAttr.getName() + num, leader);
								} else {
									hm.put(elementInner.getName() + "-"
											+ leaderAttr.getName() + num, "leader");
								}
							} else {
								hm.put(elementInner.getName() + "-leader" + num,"leader");
							}
						} else {
							hm.put(elementInner.getName() + num, elementInner.getText());
						}
					}
				}
	
			} catch (DocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	  }
}
